package myQueue;

// 使用单链表模拟实现队列功能 --复杂度O(1)
// 先进先出

public class MyQueue {
    // 使用内部类--结点类-单链表
    static class Node {
        public int val;
        public Node next;
        public Node(int val) {
            this.val = val;
        }
    }

    // 定义头尾结点
    public Node head;
    public Node tail;

    // 开始模拟功能实现

    // 有效元素个数
    public static int usedSize;

    // 入队 offer
    public void offer(int val) {
        Node node = new Node(val);
        // 首先进行判空
        if(this.head==null) {
            this.head = node;
            this.tail = node;
        } else {
            // 存在则直接操作
            this.tail.next = node;
            this.tail = this.tail.next;
        }
        usedSize++;
    }

    // 出队 poll:删除头结点！
    public int poll() {
        // 首先进行判空：
        if(this.head==null) {
            throw new EmptyQueueException("sorry 队列为空！");
        }
        // 保存旧的元素
        int oldVal = this.head.val;
        // 再进行是否只有一个元素判断
        if(this.head.next==null) {
            this.head = null;
            this.tail = null;
        } else {
            // 多个元素
            this.head = this.head.next;
        }
        usedSize--;
        return oldVal;
    }

    // 查看当前头元素（不删除）peek
    public int peek() {
        // 首先进行判空
        if(this.head==null) {
            throw new EmptyQueueException("sorry 队列为空！");
        }
        return this.head.val;
    }

    // 求有效长度（元素个数）
    public int size() {
        return usedSize;
    }

    // 检测队列是否为空
    public boolean isEmpty() {
        return size()==0;
    }

    // 没有此方法
    /*// 测试打印，实际方法并没有
    public void print() {
        Node cur = this.head;
        while(cur!=null) {
            System.out.print(cur.val+" ");
            cur = cur.next;
        }
        System.out.println();
    }*/
}
